const http = require('http');

/**
 * 发送HTTP请求的简单函数
 */
function makeRequest(options, data = null) {
    return new Promise((resolve, reject) => {
        const req = http.request(options, (res) => {
            let body = '';
            res.on('data', chunk => body += chunk);
            res.on('end', () => {
                try {
                    const result = {
                        statusCode: res.statusCode,
                        data: body ? JSON.parse(body) : null
                    };
                    resolve(result);
                } catch (error) {
                    resolve({ statusCode: res.statusCode, data: body });
                }
            });
        });
        
        req.on('error', reject);
        
        if (data) {
            req.write(JSON.stringify(data));
        }
        
        req.end();
    });
}

/**
 * 测试系统功能
 */
async function testSystem() {
    console.log('开始系统功能测试...');
    
    const baseOptions = {
        hostname: 'localhost',
        port: 3000,
        headers: {
            'Content-Type': 'application/json'
        }
    };
    
    try {
        // 1. 测试获取区域列表
        console.log('\n1. 测试获取区域列表...');
        const areasResult = await makeRequest({
            ...baseOptions,
            path: '/api/areas',
            method: 'GET'
        });
        
        if (areasResult.statusCode === 200) {
            console.log(`✓ 获取到 ${areasResult.data.length} 个区域`);
            console.log('区域列表:', areasResult.data.map(area => area.name).join(', '));
        } else {
            console.log('✗ 获取区域列表失败:', areasResult.statusCode);
        }
        
        // 2. 测试获取维修项目列表（使用重庆市育才中学，ID=7）
        console.log('\n2. 测试获取维修项目列表...');
        const itemsResult = await makeRequest({
            ...baseOptions,
            path: '/api/repair-items/7',
            method: 'GET'
        });
        
        if (itemsResult.statusCode === 200) {
            console.log(`✓ 获取到 ${itemsResult.data.length} 个维修项目`);
            console.log('前5个项目:', itemsResult.data.slice(0, 5).map(item => item.name).join(', '));
        } else {
            console.log('✗ 获取维修项目列表失败:', itemsResult.statusCode);
        }
        
        // 3. 测试提交计价单
        console.log('\n3. 测试提交计价单...');
        const quotationData = {
            area_id: 7,
            location: '测试教室101',
            person: '张三',
            repair_date: '2024-01-15',
            items: JSON.stringify([
                { id: 1, name: '补加氟材料费及技术服务费', specification: '1P-1.5P挂机', unit: '次', price: 80, quantity: 1 }
            ])
        };
        
        const submitResult = await makeRequest({
            ...baseOptions,
            path: '/api/quotations',
            method: 'POST'
        }, quotationData);
        
        if (submitResult.statusCode === 201) {
            console.log(`✓ 计价单提交成功，ID: ${submitResult.data.id}`);
        } else {
            console.log('✗ 计价单提交失败:', submitResult.statusCode, submitResult.data);
        }
        
        // 4. 测试管理端获取计价单
        console.log('\n4. 测试管理端获取计价单...');
        const adminQuotationsResult = await makeRequest({
            ...baseOptions,
            path: '/api/admin/quotations',
            method: 'GET'
        });
        
        if (adminQuotationsResult.statusCode === 200) {
            console.log(`✓ 管理端获取到 ${adminQuotationsResult.data.length} 个计价单`);
        } else {
            console.log('✗ 管理端获取计价单失败:', adminQuotationsResult.statusCode);
        }
        
        // 5. 测试管理端获取所有维修项目
        console.log('\n5. 测试管理端获取所有维修项目...');
        const adminItemsResult = await makeRequest({
            ...baseOptions,
            path: '/api/admin/repair-items',
            method: 'GET'
        });
        
        if (adminItemsResult.statusCode === 200) {
            console.log(`✓ 管理端获取到 ${adminItemsResult.data.length} 个维修项目`);
        } else {
            console.log('✗ 管理端获取维修项目失败:', adminItemsResult.statusCode);
        }
        
        console.log('\n=== 测试完成 ===');
        console.log('✓ 系统功能测试完成，所有主要功能正常运行');
        
    } catch (error) {
        console.error('✗ 测试过程中发生错误:', error.message);
    }
}

// 执行测试
testSystem();